//
// Created by Administrator on 2022/1/2.
//

#ifndef CPP_LEARNING_AVL_TREE_TEST_HPP
#define CPP_LEARNING_AVL_TREE_TEST_HPP

#include "../src/AVL.hpp"

#include <iostream>
using namespace std;

namespace AVL_TREE_TEST{

    template <typename T>
    struct Visit_AVL{
        void operator() ( T& e){
            cout<<e<<" ";
        }
    };



/**
 * 对这样的树进行测试
 *                                                  8
 *                        4                                                        11
 *
 *           2                        6                              9                         12
 *     1           3            5            7                                10
 */

    void avl_test_ll_insert(){
        Visit_AVL<int> visit;

        AVLTree<int> avlTree;
        avlTree.insert(8);
        avlTree.insert(7);
        avlTree.insert(6);

        avlTree.travIn(visit);
        cout<<endl;
        avlTree.travPre(visit);
        cout<<endl;


        avlTree.insert(5);
        avlTree.travIn(visit);
        cout<<endl;
        avlTree.travPre(visit);
        cout<<endl;

        avlTree.insert(4);
        avlTree.travIn(visit);
        cout<<endl;
        avlTree.travPre(visit);
        cout<<endl;

    }

    void avl_test_lr_insert(){
        Visit_AVL<int> visit;

        AVLTree<int> avlTree;
        avlTree.insert(8);
        avlTree.insert(5);
        avlTree.insert(6);

        avlTree.travIn(visit);
        cout<<endl;
        avlTree.travPre(visit);
        cout<<endl;


    }


    void avl_test_rr_insert(){
        Visit_AVL<int> visit;

        AVLTree<int> avlTree;
        avlTree.insert(8);
        avlTree.insert(9);
        avlTree.insert(10);

        avlTree.travIn(visit);
        cout<<endl;
        avlTree.travPre(visit);
        cout<<endl;

    }

    void avl_test_rl_insert(){
        Visit_AVL<int> visit;

        AVLTree<int> avlTree;
        avlTree.insert(8);
        avlTree.insert(11);
        avlTree.insert(10);

        avlTree.travIn(visit);
        cout<<endl;
        avlTree.travPre(visit);
        cout<<endl;

    }

    void avl_test_ll_remove(){
        Visit_AVL<int> visit;

        AVLTree<int> avlTree;
        avlTree.insert(8);
        avlTree.insert(7);
        avlTree.insert(6);

        avlTree.travIn(visit);
        cout<<endl;
        avlTree.travPre(visit);
        cout<<endl;


        avlTree.insert(5);
        avlTree.travIn(visit);
        cout<<endl;
        avlTree.travPre(visit);
        cout<<endl;

        avlTree.remove(8);
        avlTree.travIn(visit);
        cout<<endl;
        avlTree.travPre(visit);
        cout<<endl;

    }
    void avl_test(){
        cout<<"avl_test_ll_insert"<<endl;
        avl_test_ll_insert();

        cout<<"avl_test_ll_remove"<<endl;
        avl_test_ll_remove();


        cout<<"avl_test_lr_insert"<<endl;
        avl_test_lr_insert();

        cout<<"avl_test_rr_insert"<<endl;
        avl_test_rr_insert();

        cout<<"avl_test_rl_insert"<<endl;
        avl_test_rl_insert();



    }
}

#endif //CPP_LEARNING_BIN_NODE_TEST_HPP
